// =====================================================================================
//
//       Filename:  console.h
//
//    Description:  Interface texte du logiciel
//
//        Version:  1.0
//        Created:  25/08/2009 08:23:00
//       Revision:  none
//       Compiler:  g++
//
//         Author:  François Hissel (fh), francois.hissel@m4x.org
//        Company:
//
// =====================================================================================

#ifndef CONSOLE_H_INC
#define CONSOLE_H_INC

#include	<string>
#include	<iostream>
#include	"application.h"

using namespace std;

/**
 * \class Console
 * \brief Interface texte de l'application
 *
 * La classe représente l'interface texte de l'application. Elle hérite de la classe Application qui lui fournit toutes les méthodes d'accès au réseau et de calcul, et y ajoute des fonctions d'affichage et de lecture de fichiers de commande.
 */
class Console {
	public:
		Application *app;	//!< Application associée à l'interface console

		/**
		 * \brief Constructeur standard
		 *
		 * Le constructeur initialise les variables de l'application, et notamment les dimensions maximales des images générées.
		 */
		Console(Application *papp):app(papp) {}

		virtual ~Console() {}	//!< Destructeur standard
		/**
		 * \brief Interprète la commande passée en argument et l'exécute
		 *
		 * La fonction interprète la commande passée par l'argument com et l'exécute en affichant ses résultats sur la sortie standard. La commande doit correspondre à exactement une ligne de texte, et doit respecter la syntaxe définie.
		 * Tous les résultats sont affichés sur le flux de sortie standard et le flux d'erreur standard, sauf mention contraire explicite dans la commande.
		 * \param com Commande à exécuter
		 *
		 * Les commandes que peut lire le programme sont les suivantes :
		 * - <b>open \c nom_du_fichier_mif \c nom_du_fichier_mid</b> : Ouvre une couche vectorielle définissant un réseau et enregistrée dans les fichiers MapInfo MIF \c nom_du_fichier_mif et MID \c nom_du_fichier_mid
		 * - <b>zoom \c x_min \c y_min \c x_max \c y_max</b> : Définit la région courante, qui correspond à la fois à la portion de carte tracée dans les fichiers exportés, et à la zone sur laquelle les cartes raster seront calculées
		 * - <b>define \c nom_variable \c valeur_variable</b> : Définit certains paramètres nécessaires à l'interprétation du fichier de définition du réseau. \c nom_variable peut prendre les valeurs suivantes :
		 * 	- \e field_way : nom du champ de la table d'attributs indiquant le sens de circulation sur le tronçon de route ; le champ doit être de type chaîne de caractères
		 * 	- \e value_direct : valeur du champ \e field_way qui correspond à un sens unique, la direction étant identique à celle stockée dans la couche
		 * 	- \e value_reverse : valeur du champ \e field_way qui correspond à un sens unique, où la direction est opposée à celle stockée dans la couche
		 * 	- \e value_double : valeur du champ \e field_way qui correspond à un double sens de circulation sur le tronçon
		 * 	- \e field_zbegin : nom du champ qui contient la cote du sommet initial du tronçon ; le champ doit être de type flottant
		 * 	- \e field_zend : nom du champ qui contient la cote du sommet final du tronçon ; le champ doit être de type flottant
		 * 	- \e print_section : noms des champs à imprimer lors de l'affichage d'un tronçon de route ; les noms doivent être séparés par des virgules
		 * 	- \e weight : formule de calcul du poids d'un arc ; la formule peut utiliser les champs attributaires de l'arc ainsi que les fonctions mathématiques les plus courantes (voir aussi \ref parserdoc et AST::Function::get_value() pour plus d'informations sur les fonctions supportées).
		 * 	- \e weight_unit : unité pour l'affichage du poids des arcs (ex : m, km, h, min, etc...). Si la valeur h:m:s est indiquée, une fonction de conversion en h:m:s sera utilisée pour avoir un meilleur affichage du temps
		 * - <b>set \c nom_variable \c valeur_variable</b> : Définit les valeurs de certains paramètres de configuration. \c nom_variable peut prendre les valeurs suivantes :
		 * 	- \e raster_size : nombre de pixels sur la largeur des cartes raster exportées
		 * 	- \e png_max_width : largeur maximale des cartes raster exportées
		 * 	- \e png_max_height : hauteur maximale des cartes raster exportées
		 * 	- \e legend : 1 indique qu'une légende doit être ajoutée aux cartes raster, 0 indique qu'aucune légende ne doit être ajoutée
		 * 	- \e color_coupe : couleur hexadécimale de la couleur des routes coupées sur les cartes exportées (PNG). Ex : 'FF0000' (rouge), '00FF00' (vert), '0000FF' (bleu), etc...
		 * 	- \e background_transparent : 1 indique que le fond des cartes générées (PNG) doit être transparent
		 * - <b>export_osiris \c fichier_itineraire \c fichier_tournee</b> : path des deux fichiers d'interface avec Osiris-inondation. Le fichier \c fichier_itineraire entreposera les données calculées pour un itinéraire par Itineris et le fichier \c fichier_tournee les infos calculées pour une tournée d'enjeux.
		 * - <b>add_source \c x \c y</b> : Ajoute une nouvelle source dont les coordonnées sont (\c x,\c y)
		 * - <b>clear_sources</b> : Supprime toutes les sources
		 * - <b>add_measure \c x \c y \c z</b> : Ajoute une nouvelle échelle située en (\c x,\c y) et définit une cote d'eau de \c z à cette échelle
		 * - <b>clear_measures</b> : Supprime toutes les échelles
		 * - <b>compute_weights</b> : Recalcule les poids de tous les arcs, lorsque les niveaux d'eau ont été modifiés
		 * - <b>compare_itineraire \c x1 \c y1 \c x2 \c y2</b> : Compare les itinéraires entre les points (\c x1,\c y1) et (\c x2,\c y2) : celui avec le niveau d'eau indiqué au préalable par "add_measure" et celui par défaut, c'est à dire celui sans eau. Les troncons sont en rouge s'ils font partie de l'itinéraire par défaut et s'ils ne sont plus accessibles avec le niveau d'eau configuré. Les tronçons de l'itinéraire de délestage sont en vert (visibles quand on exporte le PNG)
		 * - <b>draw_path \c x1 \c y1 \c x2 \c y2</b> : Calcule l'itinéraire entre les points (\c x1,\c y1) et (\c x2,\c y2) ; les points seront projetés sur le réseau avant le calcul de l'itinéraire
		 * - <b>clear_path</b> : Efface le tracé de l'itinéraire
		 * - <b>add_stake \c x \c y</b> : Ajoute un nouvel enjeu dont les coordonnées sont (\c x,\c y)
		 * - <b>clear_stakes</b> : Supprime tous les enjeux
		 * - <b>draw_tour [\c mode=0] [\c nb_iterations=20] [\c nb_fourmis=800] [\c alpha=1] [\c beta=2] [\c rho=0,2]</b> : Calcule la meilleure tournée depuis la première source placée vers l'ensemble des enjeux. Les points seront projetés sur le réseau avant le calcul des itinéraires. mode définit l'algorithme à utiliser : si mode=1, un algorithme de parcours systématique est choisi, qui retourne toujours la solution optimale mais dont le temps de calcul augmente très rapidement avec le nombre d'enjeux (ne pas dépasser 11 en pratique) ; si mode=2, un algorithme heuristique basé sur la simulation d'une colonie de fourmis est utilisé ; si mode=0, l'algorithme le plus adapté est automatiquement choisi en fonction du nombre de noeuds. Les autres paramètres sont des valeurs utilisées pour la simulation de la colonie de fourmis. La fonction possède de nombreux paramètres par défaut, si l'un est omis, tous les paramètres situés après lui doivent l'être aussi.
		 * - <b>draw_accessibility</b> [\c max] : Calcule la carte d'accessibilité à partir des sources indiquées, l'échelle de couleur est adaptée pour représenter les distances entre 0 et max
		 * - <b>draw_scheme</b> : Calcule la carte de desserte à partir des sources indiquées
		 * - <b>draw_heights</b> [\c max] : Calcule la carte des cotes d'eau, l'échelle de couleur est adaptée pour représenter les cotes entre 0 et max
		 * - <b>export_png \c nom_du_fichier</b> : Exporte le tracé des cartes vectorielles et raster dans le fichier mentionné
		 * - <b>export_zoom \c nom_du_fichier</b> : Exporte les coordonnées réelles du zoom du MIF/MID. Utile quand on génère une carte pour la géoréférencer par la suite.
		 * - <b>export_svg \c nom_du_fichier</b> : Exporte le réseau routier en pseudo-SVG pour qu'OSIRIS-inondation puisse tracer ce réseau dans son module de cartographie
		 * - <b>import_raster \c nom_du_fichier</b> : Importe une carte raster (un MNT par exemple) depuis un fichier au format ArcInfo ASCII. Seule la portion de la carte comprise dans les frontières du zoom sera importée
		 * - <b>export_raster \c nom_du_fichier</b> : Exporte le tracé de la carte raster dans le fichier au format ArcInfo ASCII mentionné
		 * - <b>open_window</b> : Ouvre l'interface graphique. Les chemins des fichiers MID/MIF doivent être configurés au préalable
		 */
		void execute_commande(string com);

		/**
		 * \brief Exécute les commandes lues depuis le flux d'entrée standard
		 *
		 * La fonction lit les commandes depuis le flux d'entrée standard, où chaque ligne correspond à une unique commande, puis les exécute. L'affichage est réalisé sur le flux de sortie standard et le flux d'erreur, sauf mention contraire explicite dans la commande.
		 */
		void execute(istream &is=cin);

		/**
		 * \brief Affiche un message à destination de l'utilisateur
		 *
		 * La fonction affiche le message spécifié en premier argument sur la sortie standard. Elle ne tient pas compte des paramètres type et titre.
		 * \param message Message à afficher
		 * \param type Code représentant le type du message, ignoré par la fonction
		 * \param titre Titre du message, ignoré par la fonction
		 */
		static void affiche(const string &message,MessageType type,const string &titre="");

		/**
		 * \brief Affiche un message d'erreur
		 *
		 * La fonction affiche le message spécifié en premier argument sur le flux de sortie d'erreur standard. Elle ne tient pas compte des paramètres type et titre.
		 * \param message Message à afficher
		 * \param type Code représentant le type du message, ignoré par la fonction
		 * \param titre Titre du message, ignoré par la fonction
		 */
		static void affiche_erreur(const string &message,MessageType type,const string &titre="");
	private:
		/**
		 * \brief Trace les images contenues en mémoire et enregistre le fichier au format PNG
		 *
		 * La fonction trace les cartes vectorielles et raster contenues en mémoire (variables Application::reseau et Application::raster) puis enregistre la carte dans le fichier PNG spécifié en argument.
		 * \param fichier Nom du fichier à enregistrer
		 * \param legende Indique si une légende doit être ajoutée à la carte. Dans ce cas, la légende sera ajoutée sur le côté droit de la carte.
		 */
		void enregistre(string fichier,bool legende);
};

/**
 * \fn void openConsole(Application *papp,istream &iss)
 * \brief Lance l'exécution du programme en mode Console
 *
 * La fonction lance l'exécution du programme en mode Console. Elle lit les commandes depuis le flux d'entrée spécifié par le paramètre iss et écrit ses résultats sur la sortie standard, sauf mention explicite du contraire.
 * \param papp Application liée à la console
 * \param iss Flux d'entrée à partir duquel les commandes doivent être lues
 */
void openConsole(Application *papp,istream &iss);

#endif /* CONSOLE_H_ */
